﻿#pragma once

//#if defined(_WIN32)
//#include <CodeAnalysis/sourceannotations.h>
//#endif

#define PYTHON_IMPORTER_API
#if defined(_WIN32)
    #if defined(_MSC_VER)
        #if defined(__BUILD_PYTHON_IMPORTER_LOADER_DLL__)
            #define PYTHON_IMPORTER_API __declspec(dllexport)
        #else
            #define PYTHON_IMPORTER_API __declspec(dllimport)
        #endif
    #else
        #define PYTHON_IMPORTER_API
    #endif
#endif

#define __WEB_IMPORTER__  0x00000001
#define __LOCAL_IMPORTER__  0x000002

//typedef int (*Py_IsInitialized_t) (void);
//typedef void (*Py_Initialize_t) (void);

//struct PyCompilerFlags;
//typedef int (*PyRun_SimpleStringFlags_t) (const char *, struct PyCompilerFlags *);
//typedef void (*Py_Finalize_t) (void);

////Define like size_t, omitting the "unsigned"
//#ifdef MS_WIN64
//typedef __int64 ssize_t;
//#else
//typedef _W64 int ssize_t;
//#endif
//#define HAVE_SSIZE_T 1
//#define _PyObject_HEAD_EXTRA
//typedef ssize_t         Py_ssize_t;

//struct PyObject;
//typedef struct PyObject* (*PyImport_ImportModule_t) (
//    const char *name            /* UTF-8 encoded string */
//    );
//typedef struct PyObject* (*PyObject_CallMethod_t) (struct PyObject *o,
//                                                const char *method,
//                                                const char *format, ...);
//typedef struct PyObject* (*PyTuple_GetItem_t) (struct PyObject*, Py_ssize_t);
//typedef long (*PyLong_AsLong_t) (struct PyObject*);
//typedef char* (*PyUnicode_AsUTF8_t) (struct PyObject *unicode);
//typedef void (*Py_DecRef_t) (struct PyObject *);

#if defined(__cplusplus)
extern "C" {
#endif

/*!
 * @brief 初始化哪些导入器
 * @param importer_type: 导入器类型,使用|组合这些值
 * @param python_runtime_version: 2007000 3004001,这样的版本表示方法
 * @return 0 ok,other failed
 */
PYTHON_IMPORTER_API int python_importer_init(const int importer_type, const int python_runtime_version);

PYTHON_IMPORTER_API int python_importer_enable_debug(const int enable);

/*!
 * @brief 当需要使用本地支持加密包和远程加密包时,请使用此接口设置好加解密的密钥
 * @param enable 启用(1)还是禁用(0),当为启用时,请设置后面的crypto_key和key_len,当为禁用时随意
 * @param crypto_key 加解密系统使用的是aes256,所以密钥需要为32字节,这里不足的将尾补0,超长的将丢弃
 * @return
 */
PYTHON_IMPORTER_API int python_importer_enable_crypto(const int enable, const char* crypto_key, const int key_len);

/*!
 * @brief 让那些有优雅退出强迫症的家伙使用,比如我
 * @return 0 ok,other failed
 */
PYTHON_IMPORTER_API int python_importer_exit();

/*!
 * @brief 为web导入器注册一个基址,这样基于此域名导入的包即可被正常导入
 * @param domain: 基址域名
 * @param protocol: 目前只支持http...
 *
 * @return 0 ok,other failed
 */
PYTHON_IMPORTER_API int python_importer_register_domain(const char* domain, const char* protocol,
                                                        /*kwargs*/
                                                        const char* cipher, const char* compress,
                                                        const char* strap, const char* baseurl,
                                                        const char* type, const char* passwd);

/*!
 * @brief 装载并运行这个包的boot接口
 * @param pkg_url: 这个包的访问路径
 * @param argc: 传递给start接口的参数个数,准确来说最多只支持10个参数...
 * @param argv: 传递给start接口的参数
 * @return 0 ok,other failed
 * @note 返回的错误码(装载包的start同此说明):
 *          -1: 内部错误
 *          0: 一切正常,运行时准备完成
 *          1: url格式错误
 *          2: url无法访问(host无法解析)
 *          3: 包的返回值非法
 *          404: url无法访问(指定的资源不存在)
 *          405: 资源内容不正确(比如请求的文件摘要不符合)
 */
PYTHON_IMPORTER_API int python_importer_load(const char* pkg_url, int argc, char* argv[], char* whats_wrong);

#if defined(__cplusplus)
}
#endif
